<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="rLGFA" id="rLGFA"><span data-lake-id="u2fc90887" id="u2fc90887">典型回答</span></h1>
  <p data-lake-id="u8f73e8b8" id="u8f73e8b8"><br></p>
  <p data-lake-id="ucedca5ac" id="ucedca5ac"><span data-lake-id="u414121ae" id="u414121ae">在Java中，线程池的拒绝策略决定了在任务队列已满的情况下，如何处理新提交的任务。当线程池达到最大容量，并且任务队列也已满时，拒绝策略就会起作用。Java提供了四种内置的拒绝策略，它们分别是：</span></p>
  <p data-lake-id="u6c7707fc" id="u6c7707fc"><br></p>
  <ul list="ueed92a56">
   <li fid="u119fdbd0" data-lake-id="uf88bce61" id="uf88bce61"><span data-lake-id="u85744acc" id="u85744acc">AbortPolicy - 这是</span><strong><span data-lake-id="u885ce09a" id="u885ce09a">默认的拒绝策略</span></strong><span data-lake-id="u08416af8" id="u08416af8">，当线程池无法接受新任务时，会抛出RejectedExecutionException异常。这意味着新任务会被立即拒绝，不会加入到任务队列中，也不会执行。通常情况下都是使用这种拒绝策略。</span></li>
   <li fid="u119fdbd0" data-lake-id="u008e916e" id="u008e916e"><span data-lake-id="u53086eb2" id="u53086eb2">DiscardPolicy - 这个策略在任务队列已满时，会丢弃新的任务而且不会抛出异常。新任务提交后会被</span><strong><span data-lake-id="u88b08449" id="u88b08449">默默地丢弃</span></strong><span data-lake-id="uc74bd02d" id="uc74bd02d">，不会有任何提示或执行。这个策略一般用于日志记录、统计等不是非常关键的任务。</span></li>
   <li fid="u119fdbd0" data-lake-id="u6e060c86" id="u6e060c86"><span data-lake-id="ufba20000" id="ufba20000">DiscardOldestPolicy - 这个策略也会丢弃新的任务，但它会先尝试将任务队列中最早的任务删除，然后再尝试提交新任务。如果任务队列已满，且线程池中的线程都在工作，可能会导致一些任务被丢弃。这个策略对于一些实时性要求较高的场景比较合适。</span></li>
   <li fid="u119fdbd0" data-lake-id="ua84c4146" id="ua84c4146"><span data-lake-id="u22bc00ff" id="u22bc00ff">CallerRunsPolicy - 这个策略将任务回退给调用线程，而不会抛出异常。调用线程会尝试执行任务。这个策略可以降低任务提交速度，适用于任务提交者能够承受任务执行的压力，但希望有一种缓冲机制的情况。</span></li>
  </ul>
  <p data-lake-id="u39a0a6e9" id="u39a0a6e9"><span data-lake-id="u8a8e6703" id="u8a8e6703">​</span><br></p>
  <pre lang="java"><code>
ThreadPoolExecutor executor = new ThreadPoolExecutor(
    10, // corePoolSize
    10, // maximumPoolSize
    0L, // keepAliveTime
    TimeUnit.MILLISECONDS, // timeUnit
    new LinkedBlockingQueue&lt;&gt;(10), 
    new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
</code></pre>
  <p data-lake-id="u62999f3d" id="u62999f3d"><br></p>
  <p data-lake-id="u7e8e03da" id="u7e8e03da"><span data-lake-id="uec74c828" id="uec74c828">一般来说，默认的拒绝策略还是比较常用的，因为大多数情况下我们不太会让任务多到线程池中放不下，要不然就提升执行速度，要不然就提升队列长度了。</span></p>
  <p data-lake-id="u400bf858" id="u400bf858"><span data-lake-id="u70a7fe0d" id="u70a7fe0d">​</span><br></p>
  <p data-lake-id="u87c0f754" id="u87c0f754"><span data-lake-id="u5119864e" id="u5119864e">需要拒绝的情况一般是特殊情况比较多，</span><strong><span data-lake-id="ud97811ed" id="ud97811ed">所以在实际工作中基本就是拒绝并抛异常的方式比较多。</span></strong></p>
 </body>
</html>